package main

import "fmt"

/**
参数传递到闭包均为引用传递，基本类型参数的直接传递一般为值copy,变长参数的传递也是slice值copy，
 */

func main()  {
	var funcs  = [4]func(){}	//func数组

	for i:=0;i<4;i++ {
		//直接传值的 defer
		defer  fmt.Println("defer i = ",i)
		//使用闭包的 defer ，传递的是引用
		defer func() {fmt.Println("defer_closure i= ",i)}()
		funcs[i]= func() {
			fmt.Println("closure i = ",i)
		}
	}
	for i,f:=range funcs{
		fmt.Print(i,"===")
		f()
	}
}
/*
1. 循环结束时，i=4，如果是值传递，此时i=4，
2. defer 是后进先出的栈模式，不同的defer,同一个defer的不同次序皆是后进先出的栈
3. 递归也是栈实现
0===closure i =  4
1===closure i =  4
2===closure i =  4
3===closure i =  4
defer_closure i=  4
defer i =  3
defer_closure i=  4
defer i =  2
defer_closure i=  4
defer i =  1
defer_closure i=  4
defer i =  0
 */